<!DOCTYPE html>
<html class="client-nojs vector-feature-night-mode-disabled vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-sticky-header-enabled" lang="en" dir="ltr"><head>
<meta charset="UTF-8">
<title>Generative Modelling Language</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="canonical" href="https://en.wikipedia.org/wiki/Generative_Modelling_Language"> <link href="./mw/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/user.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./mw/site.styles.css">
<link rel="stylesheet" type="text/css" href="./mw/noscript.css">
<link rel="stylesheet" type="text/css" href="./footer.css">
<link rel="stylesheet" type="text/css" href="./vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Generative_Modelling_Language rootpage-Generative_Modelling_Language skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading">
<span id="openzim-page-title" class="mw-page-title-main"><span class="mw-page-title-main">Generative Modelling Language</span></span>
</h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="en" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr"><style data-mw-deduplicate="TemplateStyles:r1251242444">
/* start https://en.wikipedia.org/ */
.mw-parser-output .ambox{border:1px solid #a2a9b1;border-left:10px solid #36c;background-color:#fbfbfb;box-sizing:border-box}.mw-parser-output .ambox+link+.ambox,.mw-parser-output .ambox+link+style+.ambox,.mw-parser-output .ambox+link+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+style+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+link+.ambox{margin-top:-1px}html body.mediawiki .mw-parser-output .ambox.mbox-small-left{margin:4px 1em 4px 0;overflow:hidden;width:238px;border-collapse:collapse;font-size:88%;line-height:1.25em}.mw-parser-output .ambox-speedy{border-left:10px solid #b32424;background-color:#fee7e6}.mw-parser-output .ambox-delete{border-left:10px solid #b32424}.mw-parser-output .ambox-content{border-left:10px solid #f28500}.mw-parser-output .ambox-style{border-left:10px solid #fc3}.mw-parser-output .ambox-move{border-left:10px solid #9932cc}.mw-parser-output .ambox-protection{border-left:10px solid #a2a9b1}.mw-parser-output .ambox .mbox-text{border:none;padding:0.25em 0.5em;width:100%}.mw-parser-output .ambox .mbox-image{border:none;padding:2px 0 2px 0.5em;text-align:center}.mw-parser-output .ambox .mbox-imageright{border:none;padding:2px 0.5em 2px 0;text-align:center}.mw-parser-output .ambox .mbox-empty-cell{border:none;padding:0;width:1px}.mw-parser-output .ambox .mbox-image-div{width:52px}@media(min-width:720px){.mw-parser-output .ambox{margin:0 10%}}@media print{body.ns-0 .mw-parser-output .ambox{display:none!important}}
/* end https://en.wikipedia.org/ */
</style>
<style data-mw-deduplicate="TemplateStyles:r1236090951">
/* start https://en.wikipedia.org/ */
.mw-parser-output .hatnote{font-style:italic}.mw-parser-output div.hatnote{padding-left:1.6em;margin-bottom:0.5em}.mw-parser-output .hatnote i{font-style:normal}.mw-parser-output .hatnote+link+.hatnote{margin-top:-0.5em}@media print{body.ns-0 .mw-parser-output .hatnote{display:none!important}}
/* end https://en.wikipedia.org/ */
</style><div role="note" class="hatnote navigation-not-searchable">This article is about computer graphics and generative computer programming. For generative models of <a href="Markov_decision_processes" class="mw-redirect" title="Markov decision processes">Markov decision processes</a>, see <a href="Markov_decision_process#Simulator_models" title="Markov decision process">Markov decision process § Simulator models</a>. For generative models in the context of statistical classification, see <a href="Generative_model" title="Generative model">Generative model</a>. For Generative Artificial Intelligence (Generative A.I.) models/systems, see <a href="Generative_artificial_intelligence" title="Generative artificial intelligence">Generative artificial intelligence</a>.</div><p><b>Generative Modelling Language</b> (GML) in <a href="Computer_graphics" title="Computer graphics">computer graphics</a> and <a href="Generative_computer_programming" class="mw-redirect" title="Generative computer programming">generative computer programming</a> is a very simple programming language for the concise description of complex 3D shapes. It follows the "Generative Modelling" paradigm, where complex datasets are represented by "lists of operations" rather than by lists of objects, which is for instance the case in a <a href="Relational_database" title="Relational database">relational database</a>.
</p><meta property="mw:PageProp/toc">
<div class="mw-heading mw-heading2"><h2 id="Overview">Overview</h2></div>
<p>Usual <a href="3D_file_formats" class="mw-redirect" title="3D file formats">3D file formats</a> describe a <a href="Virtual_world" title="Virtual world">virtual world</a> in terms of <a href="Geometric_primitive" title="Geometric primitive">geometric primitives</a>. These may be cubes and spheres in a <a href="Constructive_solid_geometry" title="Constructive solid geometry">CSG</a> tree, <a href="NURBS" class="mw-redirect" title="NURBS">NURBS</a> patches, a set of <a href="Implicit_function" title="Implicit function">implicit functions</a>, a <a href="Triangle_mesh" title="Triangle mesh">triangle mesh</a>, or just a <a href="Point_cloud" title="Point cloud">cloud of points</a>. The term "generative 3D modelling" describes a different paradigm for describing shape. The main idea is to replace 3D objects by object-generating operations: A shape is described by a sequence of processing steps, rather than the triangles which are the result of applying these operations. Shape design becomes rule design. The approach can be generally applied to any shape representation that provides a basic set of generating functions, called in this context 'elementary shape operators'. Its effectiveness has been demonstrated, e.g., in the field of procedural <a href="Mesh_generation" title="Mesh generation">mesh generation</a>, with <a href="Euler_operator_(digital_geometry)" title="Euler operator (digital geometry)">Euler operators</a> as complete and closed set of invertible shape generating functions for meshes, operating on the half-edge level.
</p><p>Generative modelling gains efficiency through the possibility of creating high-level shape operators from low-level shape operators. Any sequence of processing steps can be grouped together to create a new <i>combined operator</i>. It may use elementary operators as well as other combined operators. Concrete values can easily be replaced by parameters, which makes it possible to separate data from operations: The same processing sequence can be applied to different input data sets. The same data can be used to produce different shapes by applying different combined operators from, e.g., a library of domain-dependent modelling operators. This makes it possible to create very complex objects from only a few high-level input parameters, such as for instance a style library.
</p>
<div class="mw-heading mw-heading2"><h2 id="The_Generative_Modelling_Language">The Generative Modelling Language</h2></div>
<p>The GML is a concrete implementation of the generative approach. It is a stack-based, <a href="Interpreted_programming_language" class="mw-redirect" title="Interpreted programming language">interpreted programming language</a>, very similar to Adobe's <a href="PostScript" title="PostScript">PostScript</a>, but without any of the 2D layout operators. It provides instead a number of operators for creating 3D models (<a href="Polygon" title="Polygon">polygons</a>, <a href="B-rep" class="mw-redirect" title="B-rep">b-reps</a>, <a href="Subdivision_surface" title="Subdivision surface">subdivision surfaces</a>). As a "shape programming language," it is a true generalization of "flat" 3D file formats like <a href="Wavefront_.obj_file" title="Wavefront .obj file">OBJ</a>, <a href="DXF" class="mw-redirect" title="DXF">DXF</a>, or <a href="VRML" title="VRML">VRML</a> that contain just lists of geometric primitives.
</p><p>Together with its <a href="OpenGL" title="OpenGL">OpenGL</a>-based <a href="Runtime_engine" class="mw-redirect" title="Runtime engine">runtime engine</a> the GML can also be seen as a viewer with an integrated modeller, to overcome the usual separation of <a href="3D_modeling" title="3D modeling">3D modelling</a> from <a href="Real-time_computer_graphics" title="Real-time computer graphics">interactive visualization</a>. Both are interwoven instead. GML permits a concise representation of parameterized 3D objects which can be evaluated on-the-fly at runtime, rendered with <a href="Level_of_detail_(computer_graphics)" title="Level of detail (computer graphics)">adaptive level-of-detail</a>, and allows for the interactive manipulation of all parameters.
</p>
<div class="mw-heading mw-heading2"><h2 id="GML_Example">GML Example</h2></div>
<table>
<tbody><tr>
<td>
<table cellpadding="0">
<tbody><tr>
<td>1:</td>
<td> </td>
<td>(0,0,-2) (1,1,0) 2 quad
</td></tr>
<tr>
<td>2:</td>
<td></td>
<td>/cyan setcurrentmaterial
</td></tr>
<tr>
<td></td>
<td></td>
<td>5 poly2doubleface
</td></tr>
<tr>
<td>3:</td>
<td></td>
<td>(0,1,1) extrude
</td></tr>
<tr>
<td>4:</td>
<td></td>
<td>(0,0,1) (1,0,1) normalize
</td></tr>
<tr>
<td></td>
<td></td>
<td>0 project_ringplane
</td></tr>
<tr>
<td>5:</td>
<td></td>
<td>(2,0,0) (0,1,-1) 2 quad
</td></tr>
<tr>
<td>6:</td>
<td></td>
<td>/yellow setcurrentmaterial
</td></tr>
<tr>
<td></td>
<td></td>
<td>5 poly2doubleface
</td></tr>
<tr>
<td>7:</td>
<td></td>
<td>0 bridgerings
</td></tr></tbody></table>
</td>
<td>
</td>
<td align="center"><span class="mw-default-size" typeof="mw:File"></span>
</td></tr></tbody></table>
<div class="mw-heading mw-heading2"><h2 id="Applications">Applications</h2></div>
<p><span class="mw-default-size" typeof="mw:File"></span>
</p><p>With procedural models, the model complexity is no longer directly (i.e., linearly) related with the file size. The <i>Procedural Cathedral</i>,<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> a basic model of the <a href="Cologne_Cathedral" title="Cologne Cathedral">Cologne Cathedral</a>, contains 70 <a href="Tracery" title="Tracery">tracery</a> windows, and a single window in highest resolution contains about 7 million triangles. These are "unfolded" from only 126 KB of GML code (18 KB zipped).
</p><p><span class="mw-default-size" typeof="mw:File"></span>
</p><p><a href="Gothic_architecture" title="Gothic architecture">Gothic architecture</a> is a prime example for the effectiveness of procedural shape design: In the Gothic style, all geometric constructions are exclusively executed using <a href="Compass_and_straightedge" class="mw-redirect" title="Compass and straightedge">compass and ruler</a>. Variations were obtained by procedurally combining in ever changing ways a set of simple basic parameterized geometric operations. Therefore, it is practically impossible to find two <a href="Tracery" title="Tracery">tracery</a> windows in different buildings that follow an identical geometric construction.
</p><p><span class="mw-default-size" typeof="mw:File"></span>
</p><p>The <i>interactive CAVE designer</i> helps to fit a <a href="Cave_automatic_virtual_environment" title="Cave automatic virtual environment">CAVE</a> into a small room. Because of the concrete bars under the ceiling it is difficult to place it using only 2D plans of the room. Degrees of freedom (blue arrows) are the position and orientation of the projection screen cubicle, the opening angle of the projectors, and the position/orientation of the top mirror. The DOFs are mildly restricted to take only valid values. DOFs are kept consistent, i.e., when moving the cubicles, the projector centers move as well (or get reflected at the walls).
</p><p><span class="mw-default-size" typeof="mw:File"></span>
</p><p>Given a set of about 30 CAD models of car wheel rims, the task was to find a common parametrization that is capable of generating each of the individual instances (<i>generative <a href="Surface_reconstruction" title="Surface reconstruction">surface reconstruction</a></i>). As a result, new, similar wheel rims can be synthesized within the design space that is spanned by the given 30 rims, that were manually classified into 3 main categories. A few of the high-level parameters can be directly manipulated using sliders and buttons (arrows and balls).
</p><p><span class="mw-default-size" typeof="mw:File"></span>
</p><p>Generative modelling suggests to differentiate between "structure" and "appearance" (e.g., the style) of 3D models. Surprisingly many objects have the same structure as a <a href="Chair" title="Chair">chair</a>, i.e., they are "close" to a chair on the <i>structural</i> level. The differentiation then permits (in principle) to apply the <i>appearance</i> of one object in this class to another.
</p><p><span class="mw-default-size" typeof="mw:File"></span>
</p><p>Didactic applet showing the construction of <a href="Voronoi_diagram" title="Voronoi diagram">Voronoi diagrams</a>: Is it possible to reconstruct the centers of the Voronoi cells from the region boundaries? The interactive applet conveys a good intuition of the idea behind the formal proof.
</p>
<div class="mw-heading mw-heading2"><h2 id="See_also">See also</h2></div>
<ul><li><a href="Procedural_generation" title="Procedural generation">Procedural generation</a></li>
<li><a href="OpenSCAD" title="OpenSCAD">OpenSCAD</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="References">References</h2></div>
<style data-mw-deduplicate="TemplateStyles:r1239543626">
/* start https://en.wikipedia.org/ */
.mw-parser-output .reflist{margin-bottom:0.5em;list-style-type:decimal}@media screen{.mw-parser-output .reflist{font-size:90%}}.mw-parser-output .reflist .references{font-size:100%;margin-bottom:0;list-style-type:inherit}.mw-parser-output .reflist-columns-2{column-width:30em}.mw-parser-output .reflist-columns-3{column-width:25em}.mw-parser-output .reflist-columns{margin-top:0.3em}.mw-parser-output .reflist-columns ol{margin-top:0}.mw-parser-output .reflist-columns li{page-break-inside:avoid;break-inside:avoid-column}.mw-parser-output .reflist-upper-alpha{list-style-type:upper-alpha}.mw-parser-output .reflist-upper-roman{list-style-type:upper-roman}.mw-parser-output .reflist-lower-alpha{list-style-type:lower-alpha}.mw-parser-output .reflist-lower-greek{list-style-type:lower-greek}.mw-parser-output .reflist-lower-roman{list-style-type:lower-roman}
/* end https://en.wikipedia.org/ */
</style><div class="reflist">
<div class="mw-references-wrap"><ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><b><a href="#cite_ref-1">^</a></b></span> <span class="reference-text"><style data-mw-deduplicate="TemplateStyles:r1238218222">
/* start https://en.wikipedia.org/ */
.mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free.id-lock-free a{background:url("./mw/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited.id-lock-limited a,.mw-parser-output .id-lock-registration.id-lock-registration a{background:url("./mw/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription.id-lock-subscription a{background:url("./mw/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:url("./mw/Wikisource-logo.svg")right 0.1em center/12px no-repeat}body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-free a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-limited a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-registration a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-subscription a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .cs1-ws-icon a{background-size:contain;padding:0 1em 0 0}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:var(--color-error,#d33)}.mw-parser-output .cs1-visible-error{color:var(--color-error,#d33)}.mw-parser-output .cs1-maint{display:none;color:#085;margin-left:0.3em}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}@media screen{.mw-parser-output .cs1-format{font-size:95%}html.skin-theme-clientpref-night .mw-parser-output .cs1-maint{color:#18911f}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .cs1-maint{color:#18911f}}
/* end https://en.wikipedia.org/ */
</style><cite id="CITEREFHavemann2005" class="citation journal cs1">Havemann, Sven (16 November 2005). <a rel="nofollow" class="external text" href="https://leopard.tu-braunschweig.de/receive/dbbs_mods_00000008">"Generative Mesh Modeling"</a>. <i>Ph.D. thesis</i>: <span class="nowrap">247–</span>254. <a href="Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<a rel="nofollow" class="external text" href="https://doi.org/10.24355%2Fdbbs.084-200603150100-7">10.24355/dbbs.084-200603150100-7</a><span class="reference-accessdate">. Retrieved <span class="nowrap">2 October</span> 2024</span>.</cite></span>
</li>
</ol></div></div>
<div class="mw-heading mw-heading2"><h2 id="Further_reading">Further reading</h2></div>
<ul><li>Michael Leyton. <i>A Generative Theory of Shape</i> (available from his <a rel="nofollow" class="external text" href="https://web.archive.org/web/20080103165019/http://www.rci.rutgers.edu/~mleyton/homepage.htm">homepage</a>)</li>
<li>John Snyder. <i>Generative Modeling for Computer Graphics and CAD: Symbolic Shape Design Using Interval Analysis</i></li></ul>
<div class="mw-heading mw-heading2"><h2 id="External_links">External links</h2></div>
<ul><li><a rel="nofollow" class="external text" href="https://web.archive.org/web/20060721140550/http://www.generative-modeling.org/">Generative-modeling.org</a> GML homepage.</li>
<li><a rel="nofollow" class="external text" href="http://www.digibib.tu-bs.de/?docid=00000008">Dissertation</a> of Sven Havemann on UB TU Braunschweig describes why and how GML was created</li>
<li><a rel="nofollow" class="external text" href="http://www.gg.caltech.edu/genmod/gen_mod_page.html">Caltech pages on GENMOD</a></li></ul></div><!--htdig_noindex--><div><div class="zim-footer">
This article is issued from <a class="external text" title="Last edited on 2024-12-22" href="https://en.wikipedia.org/wiki/?title=Generative_Modelling_Language&oldid=1264644113">Wikipedia</a>. The text is available under <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Creative Commons Attribution-Share Alike 4.0</a> unless otherwise noted. Additional terms may apply for the media files.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
</body></html>